package com.cskaoyan.javase.array._2memory;

/**
 * 定义两个数组：
 * 静态初始化一个数组，输出数组名，元素取值，长度
 * 然后声明第二个数组，把第一个数组的地址赋值给第二个数组。
 * 输出第二个数组的数组名，元素取值，长度
 * 然后给第二个数组赋值，再次输出两个数组的名及元素
 *
 *
 * 一个经典的初学者问题
 * 既然引用数据类型具有默认初始化，对象中的元素具有默认值，那为什么声明一个数组后为什么不能立刻使用呢？
 * 对象中的元素才具有默认值
 * 而如果是一个局部变量引用,是没有默认值的,必须手动初始化赋值才能够使用该引用
 *
 * @since 11:21
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo4 {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        /*
            把arr的地址赋值给arr2
            这时这两个引用完全指向同一个对象
            引用中存储的地址是一样的
          */
        int[] arr2 = arr;
        System.out.println(arr);
        System.out.println(arr2);

        /*
            动态初始化
            在Java中只要看到new关键字
            那么它就一定要在堆山创建一个新的独立的对象
          */
        int[] arr3 = new int[3];
        System.out.println(arr3);

        double[] arr4 = new double[3];

        /*
            "=="在连接引用数据类型的引用时:
                1.必须连接相同的引用数据类型(或者有关联的)
                2.这时比较运算符比较的是引用中存放的地址
                    只要当两个引用中存放的地址完全一样时,才会返回true
                    也就是说,只有当两个引用完全指向同一个对象时,才会返回true
         */
        System.out.println(arr == arr2);
        System.out.println(arr == arr3);
        System.out.println(arr2 == arr3);
        // System.out.println(arr3 == arr4);


        arr[0] = 100;
        /*
            多个引用指向同一个对象,相当于一个对象有多个名字
            无论使用哪个引用操作对象
            对象已经改变了
            那么无论再用哪个引用访问,都能够看到变化
         */
        System.out.println(arr2[0]);
    }
}
